package business.global.room;

import java.util.BitSet;

import BaseThread.BaseMutexObject;
import BaseThread.ThreadManager;
import business.global.shareplayback.SharePlayBackKeyMgr;
import com.ddm.server.common.CommLogD;
import com.ddm.server.common.Config;
import com.ddm.server.common.utils.CommFile;
import com.ddm.server.common.utils.CommMath;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import core.db.entity.clarkGame.PlayerPlayBackBO;
import jsproto.c2s.cclass.playback.PlayBackDateTimeInfo;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

/**
 * 回放码管理器
 *
 * @author clark
 */
@Data
public class PlayBackMgr {
    private static PlayBackMgr instance = new PlayBackMgr();

    public static PlayBackMgr getInstance() {
        return instance;
    }

    private PlayBackMgr() {
        // 初始 100000-999999,key存在。
        this.getSet().set(100000, 999999, true);
    }

    private final BitSet set = new BitSet(899999);

    /**
     * 取余值
     */
    private final static int MOD = 90;

    /**
     * 回放最小值
     */
    public final static int VALUE =1000000;

    public void init() {
        initBitSet();
    }

    private final BaseMutexObject _lock = new BaseMutexObject();

    public void lock() {
        _lock.lock();
    }

    public void unlock() {
        _lock.unlock();
    }

//    // 领取key
//    public int getNewKey() {
//        try {
//            lock();
//            // 检查key值是否用完。
//            if (set == null || set.cardinality() <= 0) {
//                CommLogD.error("PlayBackMgr set == null || set.cardinality() <= 0");
//                return 0;
//            }
//            // 随机获取key值
//            int index = set.nextSetBit(CommMath.randomInt(set.cardinality() - 1));
//            if (index < 0) {
//                // 出现标问题
//                CommLogD.error("PlayBackMgr getNewKey index < 0");
//                return 0;
//            }
//            // 在字典中清除获取的key值
//            set.clear(index);
//            return index;
//        } finally {
//            unlock();
//        }
//
//    }

//    public void clear() {
//        ThreadManager.getInstance().regThread(Thread.currentThread().getId());
//
//        try {
//            lock();
////            // 初始 100000-999999,key存在。
////            this.getSet().set(100000, 999999, true);
//            //清理掉缓存的当前回放码
//            if(Config.isShare()){
//                SharePlayBackKeyMgr.getInstance().remove();
//            }
//        } finally {
//            unlock();
//        }
//    }

    /**
     * 第一级目录
     * 每日文件夹的可以
     * @return
     */
    private final String dayKey () {
        DateTime nowTime = new DateTime();
        String nowToString = nowTime.toString("yyyyMMdd");
        int week = nowTime.getDayOfWeek();
        // 第一级目录java yyyyMMdd 周一
        // 2020021102
        return String.format("%s0%d", nowToString, week);
    }

    /**
     * 文件存储路径
     *
     * @param playBackDateTimeInfo
     * @return
     */
    public String path(PlayBackDateTimeInfo playBackDateTimeInfo) {
        //  ../bin/2020021102/62/2445112
        return String.format("%s/%s/%d/%d",Config.PlayBackFilePath(),playBackDateTimeInfo.getDayKey(), playBackDateTimeInfo.getCode() % MOD, playBackDateTimeInfo.getCode());
    }

    /**
     * 通过回放码获取文件
     *
     * @param code
     * @return
     */
    public String getFile(int code) {
        if (code < 1) {
            return null;
        }
        // 回放码：2445112
        DateTime nowTime = new DateTime();
        int week = nowTime.getDayOfWeek();
        // 回放码字符串
        String codeStr = String.valueOf(code);
        // 周几
        int codeWeek = Integer.parseInt(codeStr.substring(0,1));
        if (codeWeek > 7) {
            return null;
        }
        // 放回值
        int codeMod = Integer.parseInt(codeStr.substring(1));
        // 根据周数获取日期时间
        String toString = (week >= codeWeek ? nowTime : nowTime.minusWeeks(1)).withDayOfWeek(codeWeek).toString("yyyyMMdd");
        // 第一级目录
        // 2020021102
        String key = String.format("%s0%d", toString, codeWeek);
        // 第二级目录
        // 62
        int mod = codeMod % MOD;
        //  ../bin/2020021102/62/2445112.json
        return String.format("%s/%s/%d/%d", Config.PlayBackFilePath(),key, mod, codeMod);
    }


    /**
     * 初始化BitSet
     */
    private final void initBitSet() {
        CommFile.FileNameList(String.format("%s/%s/",Config.PlayBackFilePath(), dayKey())).stream().forEach(k -> {
            if (StringUtils.isNumeric(k)) {
                set.clear(Integer.parseInt(k));
            }
        });
    }

    public static void main(String[] args) {
        int playBackCode = 1370749;
        String filePath = PlayBackMgr.getInstance().getFile(playBackCode);
        System.out.println(filePath);
        String content = "{\"id\":0,\"roomID\":719830,\"setID\":1,\"endTime\":1696814978,\"playBackRes\":\"{\\\"playbackList\\\":[{\\\"name\\\":\\\"SSSS_Config\\\",\\\"res\\\":{\\\"cfg\\\":{\\\"zhuangjiaguize\\\":-1,\\\"huase\\\":[],\\\"difen\\\":0,\\\"daqiang\\\":1,\\\"guize\\\":0,\\\"isKeptOutAfterStartGame\\\":false,\\\"paixingfenshu\\\":0,\\\"jushu\\\":1,\\\"renshu\\\":4,\\\"fangfei\\\":0,\\\"setCount\\\":20,\\\"playerNum\\\":6,\\\"playerMinNum\\\":2,\\\"paymentRoomCardType\\\":0,\\\"wanfa\\\":0,\\\"kexuanwanfa\\\":[0,2],\\\"clubId\\\":78,\\\"createType\\\":1,\\\"gaoji\\\":[4],\\\"sign\\\":2,\\\"fangjian\\\":[0],\\\"xianShi\\\":0,\\\"jiesan\\\":3,\\\"isClubMemberCreateRoom\\\":false,\\\"clubWinnerPayConsume\\\":0,\\\"clubCostType\\\":0,\\\"unionId\\\":61,\\\"gameIndex\\\":101,\\\"roomName\\\":\\\"大菠萝\\\",\\\"roomSportsThreshold\\\":0.0,\\\"sportsDouble\\\":1.0,\\\"roomSportsType\\\":1,\\\"autoDismiss\\\":-10000.0,\\\"roomSportsEveryoneConsume\\\":0.0,\\\"prizePool\\\":0.0,\\\"password\\\":\\\"\\\",\\\"xiaojuqiepai\\\":0,\\\"dajusuanfen\\\":0},\\\"isClub\\\":false,\\\"roomType\\\":4}},{\\\"name\\\":\\\"SSSS_SetStart\\\",\\\"res\\\":{\\\"roomID\\\":719830,\\\"setInfo\\\":{\\\"roomID\\\":0,\\\"state\\\":\\\"Init\\\",\\\"setStartTime\\\":1696814972944,\\\"setCurrentTime\\\":1696814972954,\\\"mapai\\\":\\\"0x2a\\\",\\\"backerPos\\\":-1,\\\"beishu\\\":0,\\\"isXiPai\\\":false,\\\"isPlaying\\\":true,\\\"posInfo\\\":[{\\\"posID\\\":0,\\\"pid\\\":603465,\\\"isPlaying\\\":true},{\\\"posID\\\":1,\\\"pid\\\":603466,\\\"isPlaying\\\":true}],\\\"posEndInfo\\\":[],\\\"setPosList\\\":[{\\\"posID\\\":0,\\\"shouCard\\\":[\\\"0x2e\\\",\\\"0x0e\\\",\\\"0x2e1\\\",\\\"0x1c\\\",\\\"0x3c\\\",\\\"0x2a\\\",\\\"0x29\\\",\\\"0x28\\\",\\\"0x35\\\",\\\"0x241\\\",\\\"0x231\\\",\\\"0x02\\\",\\\"0x221\\\"],\\\"special\\\":-1}],\\\"setEnd\\\":{\\\"endTime\\\":0,\\\"pResults\\\":[],\\\"setId\\\":0},\\\"setID\\\":1}},\\\"setPosCard\\\":[[{\\\"suit\\\":\\\"GUI\\\",\\\"rank\\\":\\\"CARD_XGUI\\\",\\\"key\\\":\\\"0x42\\\",\\\"type\\\":4,\\\"cardID\\\":14,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_KING\\\",\\\"key\\\":\\\"0x0d\\\",\\\"type\\\":0,\\\"cardID\\\":12,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_KING\\\",\\\"key\\\":\\\"0x2d1\\\",\\\"type\\\":2,\\\"cardID\\\":12,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_QUEUE\\\",\\\"key\\\":\\\"0x0c\\\",\\\"type\\\":0,\\\"cardID\\\":11,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_JACK\\\",\\\"key\\\":\\\"0x0b\\\",\\\"type\\\":0,\\\"cardID\\\":10,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_TEN\\\",\\\"key\\\":\\\"0x1a\\\",\\\"type\\\":1,\\\"cardID\\\":9,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_NINE\\\",\\\"key\\\":\\\"0x19\\\",\\\"type\\\":1,\\\"cardID\\\":8,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_EIGHT\\\",\\\"key\\\":\\\"0x08\\\",\\\"type\\\":0,\\\"cardID\\\":7,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_EIGHT\\\",\\\"key\\\":\\\"0x18\\\",\\\"type\\\":1,\\\"cardID\\\":7,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_SIX\\\",\\\"key\\\":\\\"0x06\\\",\\\"type\\\":0,\\\"cardID\\\":5,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_SIX\\\",\\\"key\\\":\\\"0x16\\\",\\\"type\\\":1,\\\"cardID\\\":5,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_FIVE\\\",\\\"key\\\":\\\"0x15\\\",\\\"type\\\":1,\\\"cardID\\\":4,\\\"ownnerPos\\\":1},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_TWO\\\",\\\"key\\\":\\\"0x12\\\",\\\"type\\\":1,\\\"cardID\\\":1,\\\"ownnerPos\\\":1}],[{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_ACE\\\",\\\"key\\\":\\\"0x2e\\\",\\\"type\\\":2,\\\"cardID\\\":13,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_ACE\\\",\\\"key\\\":\\\"0x0e\\\",\\\"type\\\":0,\\\"cardID\\\":13,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_ACE\\\",\\\"key\\\":\\\"0x2e1\\\",\\\"type\\\":2,\\\"cardID\\\":13,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"CLUBS\\\",\\\"rank\\\":\\\"CARD_QUEUE\\\",\\\"key\\\":\\\"0x1c\\\",\\\"type\\\":1,\\\"cardID\\\":11,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"SPADES\\\",\\\"rank\\\":\\\"CARD_QUEUE\\\",\\\"key\\\":\\\"0x3c\\\",\\\"type\\\":3,\\\"cardID\\\":11,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_TEN\\\",\\\"key\\\":\\\"0x2a\\\",\\\"type\\\":2,\\\"cardID\\\":9,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_NINE\\\",\\\"key\\\":\\\"0x29\\\",\\\"type\\\":2,\\\"cardID\\\":8,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_EIGHT\\\",\\\"key\\\":\\\"0x28\\\",\\\"type\\\":2,\\\"cardID\\\":7,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"SPADES\\\",\\\"rank\\\":\\\"CARD_FIVE\\\",\\\"key\\\":\\\"0x35\\\",\\\"type\\\":3,\\\"cardID\\\":4,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_FOUR\\\",\\\"key\\\":\\\"0x241\\\",\\\"type\\\":2,\\\"cardID\\\":3,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_THREE\\\",\\\"key\\\":\\\"0x231\\\",\\\"type\\\":2,\\\"cardID\\\":2,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"DIAMONDS\\\",\\\"rank\\\":\\\"CARD_TWO\\\",\\\"key\\\":\\\"0x02\\\",\\\"type\\\":0,\\\"cardID\\\":1,\\\"ownnerPos\\\":0},{\\\"suit\\\":\\\"HEARTS\\\",\\\"rank\\\":\\\"CARD_TWO\\\",\\\"key\\\":\\\"0x221\\\",\\\"type\\\":2,\\\"cardID\\\":1,\\\"ownnerPos\\\":0}]]},{\\\"name\\\":\\\"SSSS_CardReadyChg\\\",\\\"res\\\":{\\\"roomID\\\":719830,\\\"pos\\\":0,\\\"isReady\\\":true},\\\"res2\\\":{\\\"roomID\\\":719830,\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"isSpecial\\\":false,\\\"special\\\":-1,\\\"isReady\\\":true,\\\"dunPos\\\":{\\\"first\\\":[\\\"0x3c\\\",\\\"0x1c\\\",\\\"0x35\\\"],\\\"second\\\":[\\\"0x2a\\\",\\\"0x29\\\",\\\"0x28\\\",\\\"0x241\\\",\\\"0x231\\\"],\\\"third\\\":[\\\"0x2e\\\",\\\"0x2e1\\\",\\\"0x0e\\\",\\\"0x221\\\",\\\"0x02\\\"]}}},{\\\"name\\\":\\\"SSSS_CardReadyChg\\\",\\\"res\\\":{\\\"roomID\\\":719830,\\\"pos\\\":1,\\\"isReady\\\":true},\\\"res2\\\":{\\\"roomID\\\":719830,\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"isSpecial\\\":false,\\\"special\\\":-1,\\\"isReady\\\":true,\\\"dunPos\\\":{\\\"first\\\":[\\\"0x2d1\\\",\\\"0x15\\\",\\\"0x12\\\"],\\\"second\\\":[\\\"0x0d\\\",\\\"0x0c\\\",\\\"0x0b\\\",\\\"0x08\\\",\\\"0x06\\\"],\\\"third\\\":[\\\"0x42\\\",\\\"0x1a\\\",\\\"0x19\\\",\\\"0x18\\\",\\\"0x16\\\"]}}},{\\\"name\\\":\\\"SSSS_Result\\\",\\\"res\\\":{\\\"roomID\\\":719830,\\\"sRankingResult\\\":{\\\"zjid\\\":0,\\\"beishu\\\":1,\\\"rankeds\\\":[{\\\"roomID\\\":719830,\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"isSpecial\\\":false,\\\"special\\\":-1,\\\"isReady\\\":true,\\\"dunPos\\\":{\\\"first\\\":[\\\"0x3c\\\",\\\"0x1c\\\",\\\"0x35\\\"],\\\"second\\\":[\\\"0x2a\\\",\\\"0x29\\\",\\\"0x28\\\",\\\"0x241\\\",\\\"0x231\\\"],\\\"third\\\":[\\\"0x2e\\\",\\\"0x2e1\\\",\\\"0x0e\\\",\\\"0x221\\\",\\\"0x02\\\"]}},{\\\"roomID\\\":719830,\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"isSpecial\\\":false,\\\"special\\\":-1,\\\"isReady\\\":true,\\\"dunPos\\\":{\\\"first\\\":[\\\"0x2d1\\\",\\\"0x15\\\",\\\"0x12\\\"],\\\"second\\\":[\\\"0x0d\\\",\\\"0x0c\\\",\\\"0x0b\\\",\\\"0x08\\\",\\\"0x06\\\"],\\\"third\\\":[\\\"0x42\\\",\\\"0x1a\\\",\\\"0x19\\\",\\\"0x18\\\",\\\"0x16\\\"]}}],\\\"pCard1\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"card\\\":1},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"card\\\":0}],\\\"pCardResult1\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"shui\\\":2,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"shui\\\":-2,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0}],\\\"pCard2\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"card\\\":5},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"card\\\":5}],\\\"pCardResult2\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"shui\\\":-2,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"shui\\\":2,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0}],\\\"pCard3\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"card\\\":8},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"card\\\":10}],\\\"pCardResult3\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"shui\\\":-10,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"shui\\\":10,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0}],\\\"killRankins\\\":[],\\\"specialPockerCard\\\":[],\\\"specialResults\\\":[],\\\"simPlayerResult\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"shui\\\":-10,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"shui\\\":10,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0}],\\\"simResults\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"shui\\\":-10,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"shui\\\":10,\\\"point\\\":0,\\\"baseMark\\\":0,\\\"doubleNum\\\":0}],\\\"posResultList\\\":[{\\\"pid\\\":603465,\\\"posIdx\\\":0,\\\"shui\\\":-10,\\\"point\\\":-10,\\\"baseMark\\\":1,\\\"doubleNum\\\":1,\\\"sportsPoint\\\":-10.0},{\\\"pid\\\":603466,\\\"posIdx\\\":1,\\\"shui\\\":10,\\\"point\\\":10,\\\"baseMark\\\":1,\\\"doubleNum\\\":1,\\\"sportsPoint\\\":10.0}]}}}]}\",\"dPos\":0,\"playerList\":\"[{\\\"pid\\\":603465,\\\"pos\\\":0,\\\"name\\\":\\\"游客_576026\\\",\\\"iconUrl\\\":\\\"\\\",\\\"sex\\\":0,\\\"point\\\":-10,\\\"sportsPoint\\\":-10.0,\\\"clubName\\\":\\\"南宁亲友圈\\\"},{\\\"pid\\\":603466,\\\"pos\\\":1,\\\"name\\\":\\\"游客_576027\\\",\\\"iconUrl\\\":\\\"\\\",\\\"sex\\\":0,\\\"point\\\":10,\\\"sportsPoint\\\":10.0,\\\"clubName\\\":\\\"南宁亲友圈\\\"}]\",\"playBackCode\":1370749,\"setCount\":20,\"roomKey\":\"692582\",\"gameType\":1,\"tabId\":1}";
        PlayerPlayBackBO playBackBO= new Gson().fromJson(content, new TypeToken<PlayerPlayBackBO>() {}.getType());
        System.out.println(playBackBO.getPlayBackRes());
        System.out.println(playBackBO.getPlayerList());
        StringBuilder playBack = new StringBuilder(playBackBO.getPlayBackRes().toString());
        System.out.println(playBack);
    }

}
